/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Servicio;

import Logica.Comandos.ComandoIniciarCarga;
import Logica.Comandos.ComandoIniciarDescarga;
import Logica.Comandos.ComandoObtenerListaArchivos;
import Logica.Comandos.ComandoValidarUsuario;
import Logica.Fabricas.Comando;
import ObjetoDominio.Archivo;
import ObjetoDominio.ArchivoXML;
import ObjetoDominio.Usuario;
import Proxy.ProxyUsuario;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 *Clase que se encarga de brindar el servicio correspondiente al cliente
 * @author guzmle
 */
public class Servicio extends Thread {
    
    private Socket _cliente;
    
    public Servicio(Socket cliente){
        _cliente = cliente;
    }
    
    /**
     * Metodo que se encarga de definir la operacion que solicita el usuario
     * para comenzar a realizarla
     */
    @Override
    public void run(){
        try {
            Comando comando;
            InputStream flujoEntrada = _cliente.getInputStream();
            DataInputStream entrada = new DataInputStream(flujoEntrada);
            String dato = ArchivoXML.ObtenerMensaje(entrada.readUTF());
            //Si la peticion es descargar archivo
            if(dato.equalsIgnoreCase("descargar")){
                String xmlUsuario = entrada.readUTF();
                Usuario usuario = ProxyUsuario.ObtenerUsuario(xmlUsuario);
                Archivo archivo = new Archivo();
                archivo.setNombre(ArchivoXML.ObtenerMensaje(entrada.readUTF()));
                archivo.setDescargado(Long.parseLong(ArchivoXML.ObtenerMensaje(entrada.readUTF())));
                comando = new ComandoIniciarDescarga(_cliente, usuario, archivo);
                comando.Ejecutar();
            }
            
            //Si la peticion es Cargar archivo
            if(dato.equalsIgnoreCase("cargar")){
                String xmlUsuario = entrada.readUTF();
                Usuario usuario = ProxyUsuario.ObtenerUsuario(xmlUsuario);
                Archivo archivo = new Archivo();
                archivo.setNombre(ArchivoXML.ObtenerMensaje(entrada.readUTF()));
                archivo.setCargando(false);
                archivo.setTamaño(Long.parseLong(ArchivoXML.ObtenerMensaje(entrada.readUTF())));
                comando = new ComandoIniciarCarga(_cliente, usuario, archivo);
                comando.Ejecutar();
            }
            
            //Si la peticion es Cargar archivo pero si la hace otro servidor
            if(dato.equalsIgnoreCase("cargarServidor")){
                String xmlUsuario = entrada.readUTF();
                Usuario usuario = ProxyUsuario.ObtenerUsuario(xmlUsuario);
                Archivo archivo = new Archivo();
                archivo.setNombre(ArchivoXML.ObtenerMensaje(entrada.readUTF()));
                archivo.setCargando(true);
                archivo.setTamaño(Long.parseLong(ArchivoXML.ObtenerMensaje(entrada.readUTF())));
                comando = new ComandoIniciarCarga(_cliente, usuario, archivo);
                comando.Ejecutar();
            }
            
            //Si la peticion es reanudar descarga de archivo
            if(dato.equalsIgnoreCase("verificar")){
                OutputStream flujoSalida = _cliente.getOutputStream();
                DataOutputStream salida = new DataOutputStream( flujoSalida );
                salida.writeUTF(ArchivoXML.CrearMensaje(String.valueOf("true")));
                
            }
            
            //Si la peticion es validar usuario
            if(dato.equalsIgnoreCase("validar")){
                comando = new ComandoValidarUsuario(_cliente,
                        ProxyUsuario.ObtenerUsuario(entrada.readUTF()));
                comando.Ejecutar();
            }
            
            //Si la peticion es avisar que un servidor se levanto
            if(dato.equalsIgnoreCase("obtenerListaArchivos")){
                OutputStream flujoSalida = _cliente.getOutputStream();
                DataOutputStream salida = new DataOutputStream( flujoSalida );
                String xmlUsuario = entrada.readUTF();
                comando = new ComandoObtenerListaArchivos(
                        ProxyUsuario.ObtenerUsuario(xmlUsuario));
                salida.writeUTF((String) comando.Ejecutar());

            }
            
            
        } catch (IOException ex) {
            System.out.println(ex);
        }catch (Exception ex) {
            System.out.println(ex);
        }
    }
}
